package controllers;

import models.Constantes;
import models.UDPSocket;

public class UDPServerController {

	private UDPSocket udpSocket;
	private VisibilidadeServer threadVisibilidade;

	public UDPServerController() {
		udpSocket = new UDPSocket(Constantes.PORTA_UDP_SERVIDOR);
		threadVisibilidade = new VisibilidadeServer();
		threadVisibilidade.start();
	}
	
	public void setServerVisible(Boolean visivel){
		synchronized (threadVisibilidade) {
			if(visivel){			
				threadVisibilidade.pausada = false;
				threadVisibilidade.notify();
			}else
				threadVisibilidade.pausada = true;
		}		
	}
	
	public boolean isVisivel(){		
		synchronized (threadVisibilidade) {
			return !threadVisibilidade.pausada;		
		}
	}

	@SuppressWarnings("deprecation")
	public void stop(){
		setServerVisible(false);
		threadVisibilidade.suspend();
		threadVisibilidade = null;
		udpSocket.stop();
	}

	class VisibilidadeServer extends Thread {
		public boolean pausada = true; 
		
		public void run() {
System.out.println("esperando");
			while(true){
				synchronized (this) {
					while(pausada){
						try {
							wait();
						} catch (Exception e) {
							System.out.println(e.getMessage());
						}
					}					
				}
				String msg = udpSocket.receberMsg().trim();
//System.out.println("recebi " + msg);
				if(msg.equals(Constantes.CMD_ESTADO_SERVIDOR)){
					String Rsp = Constantes.CMD_ESTADO_ON_SERVIDOR + "\n" + 
							CriarController.JogoNome + "\n" + CriarController.JogoNumJogadores; 
					udpSocket.enviarMsg(Rsp, udpSocket.getRcvIp(), 
							Constantes.PORTA_UDP_CLIENTE_REC);
				}
			}
		}
		
	}
	
}
